package persistencia.dao;

import java.util.List;

import org.hibernate.Query;

import persistencia.hbt.HibernateUtil;
import bean.Cliente;
import bean.EntidadPersistente;
import bean.EstadoOrden;
import bean.ItemOrdenPedido;
import bean.OrdenPedido;
import bean.Producto;

@SuppressWarnings("unchecked")
public class OrdenPedidoDAO extends EntidadPersistenteDAO{
	private static OrdenPedidoDAO instancia = null;
	
	public static OrdenPedidoDAO getInstancia(){
		if(instancia == null)
			instancia = new OrdenPedidoDAO();
		
		if (session == null)
			session = HibernateUtil.getSession();
		
		return instancia;
	}
	
	public List<ItemOrdenPedido> obtenerItemsOrdenDePedidoNoCumplidosParaProductoRecibido(Producto productoRecibido) {
		String q = "select iop from OrdenPedido op, ItemOrdenPedido iop " +
				" where op = iop.ordenPedido  " +
				" and iop.producto = :producto " +
				" and iop.cantidadPedida > (select coalesce(sum(pe.cantidadEnviada),0) from ProductoEntregado pe where pe.itemOrdenPedido = iop) " +
				" order by op.fechaRecepcion asc " ;
		
		Query query = session.createQuery(q);
		query.setEntity("producto", productoRecibido);
		
		return query.list();
	}
	
	public List<ItemOrdenPedido> obtenerItemsOrdenPedidoPendientesDeEnvioAlCliente() {
		String q = "select iop from ItemOrdenPedido iop,  ProductoEntregado pe " +
				" where pe.itemOrdenPedido = iop " +
				" and pe.remitoODV is not null and pe.remitoCliente is null";
		
		Query query = session.createQuery(q);
		return query.list();
	}

	public OrdenPedido buscar(EntidadPersistente entidad)
	{
		OrdenPedido orden = (OrdenPedido) entidad;
		
		if (orden.getId() != null)
			return (OrdenPedido) super.buscar(orden);
		else if (orden.getNumeroPedido() != null && orden.getCliente() != null)
			return this.buscar(orden.getNumeroPedido(), orden.getCliente());
		
		return null;
	}
	
	private OrdenPedido buscar(Integer nroOrdenPedido, Cliente cliente){
		Query query = session.createQuery(" from OrdenPedido op where op.numeroPedido = :num and op.cliente = :cli");
		query.setInteger("num", nroOrdenPedido);
		query.setEntity("cli", cliente);
		OrdenPedido ordenPedido = (OrdenPedido) query.setFirstResult(0).setMaxResults(1).uniqueResult();

		return ordenPedido;
	}
	
	public List<OrdenPedido> buscarNuevosPedidos(){
		Query query = session.createQuery(" from OrdenPedido op where op.estado = :estado");
		query.setInteger("estado", EstadoOrden.nuevo.ordinal());
		
		return query.list();
	}
}
